package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Vector;

import Controller.Sistema;
import Model.Estado;
import Model.Linea;
import Model.LineaAdicional;
import Model.LineaDisponible;

public class AdministradorPersistenciaLinea {
	private static AdministradorPersistenciaLinea instancia;
	
	private AdministradorPersistenciaLinea(){
		
	}

	public static AdministradorPersistenciaLinea getInstancia() {
		if(instancia == null){
			instancia = new AdministradorPersistenciaLinea();
		}
		return instancia;
	}
	
	public void insert(Linea linea, String dni){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia;
		if(!linea.isAdicional()){
			sentencia = "INSERT INTO Lineas(nroLinea,fechaAlta,dni,nroPlan) VALUES(?,?,?,?)";
		}else{
			sentencia = "INSERT INTO Lineas(nroLinea,fechaAlta,dni,nroPlan,nombreAdicional) VALUES(?,?,?,?,?)";
		}
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			java.sql.Date fechaAltaSQL = new java.sql.Date(linea.getFechaAlta().getTime());
			ps.setString(1, linea.getNroLinea());
			ps.setDate(2, fechaAltaSQL);
			ps.setString(3, dni);
			ps.setInt(4, linea.getPlan().getNroPlan());
			if(linea.isAdicional()){
				ps.setString(5, ((LineaAdicional) linea).getNombreAdicional());
			}
			
			ps.execute();
			
			cambiarEstadoLineaDisponible(linea.getNroLinea(),Estado.NO_DISPONIBLE);
			
			PoolConnection.getPoolConnection().releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
	private void cambiarEstadoLineaDisponible(String nroLinea, int codigo) {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "UPDATE LineaDisponible SET Estado = ? WHERE numero = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setInt(1, codigo);
			ps.setString(2, nroLinea);
			
			ps.execute();
			
			PoolConnection.getPoolConnection().releaseConnection(con);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void update(Linea linea){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia;
		if(linea.isAdicional()){
			sentencia = "UPDATE Lineas SET fechaAlta = ?, nombreAdicional = ? WHERE nroLinea = ?";
		}else{
			sentencia = "UPDATE Lineas SET fechaAlta = ? WHERE nroLinea = ?";
		}
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			java.sql.Date fechaAltaSQL = new java.sql.Date(linea.getFechaAlta().getTime());
			ps.setDate(1, fechaAltaSQL);
			if(linea.isAdicional()){
				ps.setString(2, ((LineaAdicional)linea).getNombreAdicional());
				ps.setString(3, linea.getNroLinea());
			}else{
				ps.setString(2, linea.getNroLinea());
			}
			
			ps.execute();
			
			PoolConnection.getPoolConnection().releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}
	
	public void delete(String nroLinea){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "DELETE FROM Lineas WHERE nroLinea = ?";
		
		try{
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setString(1, nroLinea);
			
			ps.execute();
			cambiarEstadoLineaDisponible(nroLinea, Estado.DISPONIBLE);
			
			PoolConnection.getPoolConnection().releaseConnection(con);
			
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public Linea buscar(String nroLinea){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Linea linea = null;
		String sentencia = "SELECT * FROM Lineas WHERE nroLinea = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setString(1, nroLinea);
			
			ResultSet result = ps.executeQuery();
			
			while(result.next()){
				String nroLineaEncontrado = result.getString("nroLinea");
				Date fechaAlta = result.getDate("fechaAlta");
				int nroPlan = result.getInt("nroPlan");
				linea = new Linea(nroLineaEncontrado);
				linea.setFechaAlta(fechaAlta);
				linea.setPlan(Sistema.getInstancia().buscarPlan(nroPlan));
			}
			
			PoolConnection.getPoolConnection().releaseConnection(con);
			return linea;
		} catch (SQLException e) {			
			e.printStackTrace();
			return null;
		}
		
	}

	public Vector<Linea> buscarLineasCliente(String dni) {
		Vector<Linea> lineas = new Vector<Linea>();
		Linea linea = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM Lineas WHERE dni = ? ORDER BY nombreAdicional";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setString(1, dni);
			
			ResultSet result = ps.executeQuery();
			
			while(result.next()){
				String nroLinea = result.getString("nroLinea");
				Date fechaAlta = result.getDate("fechaAlta");
				int nroPlan = result.getInt("nroPlan");
				String nombreAdicional = result.getString("nombreAdicional");
				if(nombreAdicional != null){
					linea = new LineaAdicional(nroLinea, nombreAdicional);
				}else{
					linea = new Linea(nroLinea);	
				}
				linea.setFechaAlta(fechaAlta);
				linea.setPlan(Sistema.getInstancia().buscarPlan(nroPlan));
				lineas.add(linea);
			}
			
			PoolConnection.getPoolConnection().releaseConnection(con);
			
			return lineas;
		} catch (SQLException e) {			
			e.printStackTrace();
			return null;
		}
	}

	public Vector<LineaDisponible> buscarLineasDisponibles() {
		Vector<LineaDisponible> lineasDisponibles = new Vector<LineaDisponible>();
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM LineaDisponible WHERE estado = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setInt(1, Estado.DISPONIBLE);
			ResultSet result = ps.executeQuery();
			while(result.next()){
				String numero = result.getString("numero");
				LineaDisponible lineaDisponible = new LineaDisponible(numero,Estado.DISPONIBLE);
				lineasDisponibles.add(lineaDisponible);
			}
			result.close();
			PoolConnection.getPoolConnection().releaseConnection(con);
			return lineasDisponibles;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		
	}

}
